﻿package CutLoad.cookies
{
	
	import CutLoad.Base;
	
	import flash.display.BitmapData;
	import flash.display.Graphics;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Rectangle;

	/**
	 * 动画序列,单张png图片处理 
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class ImgMovie extends Base
	{
		private var currentFrame:uint=0
		private var arrBmap:Array=new Array();
		private var arrBmapAll:Array=new Array();
		public var w:Number,h:Number
		
		private var isPlay:Boolean=false;
		private var fpsSpeed:Number=0;
		private var fpsSpeed_i:Number=0;
		
		private var comp:Function=null;
		
		private var bdDraw:BitmapData
		//第几组动画
		private var movieWhich:Number=-1
		/**
		 * 初始化
		 * @param bd_img 生成动画的BitmapData对象
		 * @param row 该图象显示动画是几行 uint
		 * @param tier 该图象显示动画是几列 uint
		 * @param arr 将该图象中的动画划分几个部份.Array 如:如果该图像是一个２*３的动画。
		    * 　　　　　　 该参数设置为［２,３］意思为：分为两组动画：第1行第１列到第２列　以及 第1行第3列到第2行第3列
		 * 
		 */
		public function ImgMovie(bd_img:BitmapData, row:uint, tier:uint, arr:Array,fpsSpeed:Number=1,isPlay:Boolean=true)
		{
			this.fpsSpeed=this.fpsSpeed_i=fpsSpeed;
			currentFrame=0
			w=bd_img.width / tier
			h=bd_img.height / row
			//
			var arrTemBmap:Array=new Array();
			var arrI:uint=0
			var ij:uint=1
			for (var i:uint=0; i < row; i++)
			{
				for (var j:uint=0; j < tier; j++)
				{
					var bd:BitmapData=new BitmapData(w, h)
					var rect:Rectangle=new Rectangle(j * w, i * h, w, h);
					bd.copyPixels(bd_img, rect, new Point(0, 0));
					arrTemBmap.push(bd)
					if (++ij > arr[arrI])
					{
						ij=1
						arrI++
						arrBmapAll.push(arrTemBmap);
						arrTemBmap=new Array();
					}
				}
			}
			this.addEventListener(Event.ENTER_FRAME,enterFrame);
			this.isPlay=isPlay
			if(this.isPlay){
				play()
			}else{
				stop();
			}
		}
		private function enterFrame(e:Event):void{
			if(!isPlay) return;
			if(fpsSpeed_i++>=fpsSpeed){
				bdDraw=nextFrame();
				if(bdDraw!=null){
					var gg:Graphics=this.graphics;
					gg.clear();
					gg.beginBitmapFill(bdDraw,null,false,false);
					gg.drawRect(0,0,w,h);
					gg.endFill();
					fpsSpeed_i=0;
				}
			}
		}
		/**
		 * 返回有几组动画 
		 * @return 
		 * 
		 */		
		public function get movieLength():Number{
			return arrBmapAll.length;
		}
		/**
		 * 设置动画段播放状态监控函数 
		 * @param comp 状态监控函数 ，格式:function(movie:Number,state:Number)    movie:第几组动画，state状态：0:正在播放,1:开头,2:结尾
		 * 
		 */		
		public function setFunComplete(comp:Function):void{
			this.comp=comp;
		}
		/**
		 * 播放第几组动画
		 * @param arrI 当前显示的动画是第几组动画。注意：第一组动画是用0表示的。
		 * 
		 */		
		public function play(arrI:uint=0):void{
			if(movieWhich==arrI) return;
			if(arrI>arrBmapAll.length-1) return;
			isPlay=true;
			movieWhich=arrI
			arrBmap=arrBmapAll[arrI]
			currentFrame=0
		}
		/**
		 * 当前动画播放到第几帧 
		 * @param frame
		 * 
		 */		
		public function gotoAndPlay(frame:Number):void{
			if(frame<0||frame>arrBmap.length-1) return;
			currentFrame=frame
		}
		/**
		 * 停止播放 
		 * 
		 */		
		public function stop():void{
			isPlay=false;
		}
		/**
		 * 当前是第几组动画 
		 * @return 
		 * 
		 */		
		public function get currentMovie():Number{
			return movieWhich;
		}
		public function set currentMovie(num:Number):void{
			play(num);
		}
		/**
		 * 获得当前画面BitmapData
		 * @return 
		 * 
		 */		
		private function nextFrame():BitmapData
		{
			if(comp!=null){
				if(currentFrame==0){
					comp(movieWhich,1);
				}else if(currentFrame==arrBmap.length-1){
					comp(movieWhich,2);
				}else{
					comp(movieWhich,0);
				}
			}
			//
			var bd:BitmapData=arrBmap[currentFrame];
			if (currentFrame + 1 < arrBmap.length)
			{
				currentFrame++
			}
			else
			{
				currentFrame=0
			}
			return bd;
		}
		override public function getShowWidth():Number{
			return w;
		}
		override public function getShowHeight():Number{
			return h;	
		}
		/**
		 * 销毁自己 
		 * 
		 */		
		override public function killMe():void{
			if(this.hasEventListener(Event.ENTER_FRAME)) this.removeEventListener(Event.ENTER_FRAME,enterFrame);
			super.killMe();
		}
	}
}